Disqueを使って遊ぶ


概要

redis作ってた人が作ってるよ~って言ってた分散メッセージブローカーがgithubにきてた。

disque

https://github.com/antirez/disque



まだα版だよみたいな感じ。



make

依存が無いのでmakeするだけでokなはず。

OS X 10.10.3 とかでそのまま動いた。

ビルドしたバイナリはsrc中に出来る。



serverたてる

disque-server をぶったたくと起動する。

初期ポートは7711になっている。このへんはconfがついてるのでそのへんと合わせてセットみたいな感じ。

スクリーンショット 2015-05-03 18.04.15.png



備え付けのコマンドラインインターフェースをつなぐ

disqueのserverに対して対象となるport指定でcli-clientを起動できる。

disqueのclientは複数のserverに対して通信をすることができる。(multi-masterってこの事か

スクリーンショット 2015-05-03 18.11.09.png

コマンドの単位とかなんかまだ変わりそうな気がする。

addjob queueName messageBody 0

で、addjobでqueueNameという名称のキューに対してmessageBodyというメッセージを送っている。 最後の0は timeout



getjob from queueName

で、queueNameというキューからメッセージを受け取っている。


Regisのpub-subとかと異なるのは、

・subscribeのための準備処理がない(メッセージブローカー一筋! 単一用途だからな!)

・複数のmasterを起動時に指定して持てる

というあたり。


複数のmasterに対して誰かがaddjobでjobを投げて、複数のmasterに対してgetjobしてる誰かが受け取る、という仕組み。

producerとconsumerそれぞれの動作ができるよ、という感じか。

仲介として、server側で、nodeという単位でメッセージのreplicationとか保持が行われる。


んで、multicastがしたい時とかどうやればいいんだろう?

→addjobする対象( = ターゲットとなるqueue)を増やす。

なるほど。



ちょっと使って良いなーと思ったところ

client側から指定できる、node自体の溜まってる内容をチェックする仕掛けがあること。

addjob オプションの maxlen がそれ。

試しに maxlen を2とかにして複数回addjobしたら、client側がエラーを得ることができた。

これで、送信者側からキューが詰まってるかどうか楽にわかる。もちろん上位での監視は別途必要なのだけど。


機構的に、役割の割り振りをclient-serverでどうやったら最速になるか、というのを、

多重配信の可能性を残しつつも最低でも一回行う、というのを基礎に組んでいる感じ。


順の保持を完璧までは頑張らない + 障害中とかで復帰時に同じメッセージを複数回受信する可能性があり得るため、clientのやるべき事がちょっとある。

(順の組み立てに関しては諦めていいんじゃないかな~っていう頻度になるような設計に見えた。複数回のほうは何かガード要素を入れる必要がありそう。)

トレードオフでわずかなこれらを残した反面、

ある程度簡潔かつ高速になってるんじゃねーかなーという感じ。



lua client

nginx-lua-moduleから使うので、書いてる。

upstreamに対してaddjob、

このクライアントに対してのdownstreamに対してgetjobを行う。

制御用の機構として、control用のqueueに対してdownstream queue nameを知らせる必要があるっぽい。

簡単ぽい。



Unity client

こちらはC#。とある理由で使うので書いてる。

複数のdownstreamのqueueに対してaddjob投げようと思う。

upstreamのqueueからは聞きまくる。


制御用の機構としてqueueNameの登録をどっかでうけとらないといけないので、control用のqueueについても聞く。

簡単ぽい。